//继续加工
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll po10[15];

ll dp[15][4];// dp[i][k] i:表示位数，k:表示前面有了连续的k个6
// dp[i][k] 表示i位数，前面有k个连续的6
bool vis[15][4]; // 记忆化数组

int n;

ll dfs(int pos, int pre) {
  if (vis[pos][pre]) // 如果已经计算过，直接返回结果
    return dp[pos][pre];
  ll ans = 0;
  // 转移
  // 如果当前位是6，那么可以继续增加连续的6
  if (pre == 3) {
    ans += po10[pos]; // 如果已经有三个6，当前位可以是任意数字
  } else {
    ans += dfs(pos - 1, pre + 1); // 继续增加连续的6
  }
  // 如果当前位不是6，那么可以重新开始连续的6
  ans += dfs(pos - 1, 0); // 重新开始计数

  vis[pos][pre] = true; // 标记为已计算
  dp[pos][pre] = ans; // 存储结果
  return ans;
}

// 检查[0,x]中是否至少有n个溜溜数
bool check(ll x) {
  memset(vis, 0, sizeof(vis)); // 重置记忆化数组
  return dfs(14, 0) >= n; // 从最高位开始调用dfs，检查是否有至少n个溜溜数
}

int main() {

  cin >> n; // 输入n
  po10[0] = 1;
  for (int i = 1; i < 15; i++)
    po10[i] = po10[i - 1] * 10; // 计算10的幂

  ll l = 666, r = 1e12, ret; // 设置搜索范围
  while (l <= r) {
    ll mid = (l + r) >> 1; // 计算中间值
    if (check(mid)) { // 检查中间值是否满足条件
      ret = mid; // 更新结果
      r = mid - 1; // 向左搜索
    } else {
      l = mid + 1; // 向右搜索
    }
  }
  cout << ret << endl; // 输出结果
  return 0;
}
